package fr.syntheses.blog.Model.DAO.HQL;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.sun.net.httpserver.Authenticator.Success;

import fr.syntheses.blog.DomainService.ServiceDaoUtilisateur;
import fr.syntheses.blog.beans.Ficheutilisateur;
import fr.syntheses.blog.beans.Utilisateur;

public class UtilisateurDaoHib implements ServiceDaoUtilisateur{


	Logger log = Logger.getLogger(UtilisateurDaoHib.class);



	// Propeties 

	List<Utilisateur> listeUtilisateur = new ArrayList<Utilisateur>();

	Utilisateur utilisateur;



	/**
	 * Cette methode permet de lister les utilisateurs.
	 * @return   List<Utilisateur>
	 */
	public final List<Utilisateur> listerUtilisateur() {


		listeUtilisateur = new ArrayList<Utilisateur>();

		Session session = null;

		Query query = null;

		try {

			session = HibernateUtil.getSession();

			try {
				query = session.createQuery("from Utilisateur order by nom");
				Iterator utilisateurs = query.iterate();

				while (utilisateurs.hasNext()) {
					listeUtilisateur.add((Utilisateur) utilisateurs.next());
				}

			} finally {	}
		} catch (HibernateException e) {
			log.fatal("/* ATTENTION GRAVE ERREUR LORS DE LA CREATION DE LA SESSION FACTORY HB */");
			log.fatal(e);
		} finally {
			//HibernateUtil.closeSessionFactory();
		}
		return listeUtilisateur;

	}


	/**
	 * Cette methode permet de récupérer un utilisateur.
	 * @return   utilisateur
	 */
	@Override
	public Utilisateur getUtilisateur(int i) {

		System.err.println("???????????????????????");
		Session session = null;

		Query query = null;

		try {

			session = HibernateUtil.getSession();

			try {

				query = session.createQuery("from Utilisateur as u where u.id = ?");

				query.setInteger(0, i);

				utilisateur = (Utilisateur) query.uniqueResult();

			} finally {	}
		} catch (HibernateException e) {
			log.fatal("/* ATTENTION GRAVE ERREUR LORS DE LA CREATION DE LA SESSION FACTORY HB */");
			log.fatal(e);
		} 

		System.err.println("???????????????????????" + utilisateur);
		return utilisateur;
	}



	/**
	 * Cette methode permet d'enregistrer un nouvel tilisateur
	 * @return   
	 */


	public int saveUtilisateur(Utilisateur utilisateur) {

		System.err.println("???????????????????????");
		Session session = null;
		Utilisateur utilisateur2 = new Utilisateur();
		Ficheutilisateur fc = new Ficheutilisateur();


		try {

			session = HibernateUtil.getSession();
			Transaction Transaction = session.beginTransaction();
			try {

				utilisateur2.setNom("pierre");
				utilisateur2.setPrenom("aa");

				utilisateur2.setFicheUtilisateur(fc);

				session.save(utilisateur2);
				Transaction.commit();


			} finally {	session.flush();
			session.close();}
		} catch (HibernateException e) {
			log.fatal("/* ATTENTION GRAVE ERREUR LORS DE LA CREATION DE LA SESSION FACTORY HB */");
			log.fatal(e);
		} 

		System.err.println("???????????????????????" + utilisateur2);

		return 1;
	}


	/**
	 * Cette methode permet de supprimer un utilisateur de la BD
	 * @return   
	 */



	@Override
	public int deleteUtilisateur(Utilisateur utilisateur2) {


		System.err.println("!!!!!!!!!!!!!!");
		Session session = null;


		try {


			session = HibernateUtil.getSession();

			Transaction Transaction = session.beginTransaction();

			try {


				utilisateur2 = (Utilisateur)session.get(Utilisateur.class, 3);

				System.out.println("[[[[[[[[[[[Delete ? : " + utilisateur2);
				session.delete(utilisateur2);


				Transaction.commit();



			} finally {
				session.close();
			}
		} catch (HibernateException e) {
			log.fatal("/* ATTENTION GRAVE ERREUR LORS DE LA CREATION DE LA SESSION FACTORY HB */");
			log.fatal(e);
		} 

		System.err.println("?????!!!!!!!!!!!" + utilisateur2);

		return 0;
	}






	/**
	 * Cette methode permet d'identifier un utilisateur.
	 * @return   
	 */


	public Utilisateur identifie(Utilisateur utilisateur) {

		System.err.println("identification !!!!!!!!!!!!!!");
		Session session = null;
		Query query = null;
		Utilisateur identUser = null;
		
		
		try {

			session = HibernateUtil.getSession();
			Transaction Transaction = session.beginTransaction();
			String motdepasse = null;
			String login = null;

			try {

				query = session.createQuery("from Utilisateur where login = ? AND motdepasse = ?");


				query.setString(0, utilisateur.getLogin());
				query.setString(1, utilisateur.getMotdepasse());
				
				identUser =  (Utilisateur) query.uniqueResult();
				


					Transaction.commit();  
					System.out.println("utilisateur non identifié");
	
			


			} finally {	}
		} catch (HibernateException e) {
			log.fatal("/* ATTENTION GRAVE ERREUR LORS DE LA CREATION DE LA SESSION FACTORY HB */");
			log.fatal(e);
		} 

		return identUser;
	}


	@Override
	public String getMdpByMailAdress(String mail) {
		System.err.println("getMdpByMailAdress !!!!!!!!!!!!!!");
		Session session = null;
		Query query = null;
		Utilisateur utilisateur = null;
		String mdp = null;
		
		
		try {

			session = HibernateUtil.getSession();
			Transaction Transaction = session.beginTransaction();

			try {
// on récupère le mail de l'utilisateur 
				query = session.createQuery("from Utilisateur where email = ?");


				query.setString(0, mail);

				
				utilisateur =  (Utilisateur) query.uniqueResult();
				
				mdp = utilisateur.getMotdepasse();

					Transaction.commit();  
					System.out.println("Mdp récupéré avec succès !");
	
			


			} finally {	}
		} catch (HibernateException e) {
			log.fatal("/* ATTENTION GRAVE ERREUR LORS DE LA CREATION DE LA SESSION FACTORY HB */");
			log.fatal(e);
		} 
		return mdp;
	}








}

